package logica.analizador;
import java.util.Stack;
import java.util.Vector;
import java.lang.StringBuffer;

import excepciones.ContenidoException;

import logica.common.TagCollection;
import logica.common.TagCollection.tagTipo;

public class AnalizadorSintactico  {
	
	private String texto;
	
	
	public AnalizadorSintactico(String aTexto)
	{
		this.texto = aTexto.trim();
	}
	
	public boolean validar() throws ContenidoException
	{
		String sTipo;
		StringBuffer documento = new StringBuffer(this.texto);		
		TagCollection tagCol = new TagCollection(); // Clase magica. 
		Stack<String> tags = new Stack<String>();
		String tag="";

		if (documento.length()==0)
		{
			throw new ContenidoException("Error: Sintaxis con errores en el texto. Documento Vacio.");
		}
		
		while (documento.length()>0)
		{
			int aperturaTag = documento.indexOf("<");
			int cierreTag = documento.indexOf(">")+1;
			if (aperturaTag != -1 && cierreTag != -1)
			{
				tag = documento.substring(aperturaTag, cierreTag);
				documento = (new StringBuffer(documento.substring(cierreTag).trim()));
				if (tagCol.esTagApetura(tag))
				{
					if (tags.empty())
					{
						sTipo = tagTipo.vacio.toString(); 
					}
					else
					{
						sTipo = tagTipo.no_vacio.toString();
					}
					
					if (tagCol.cumpleCondicion(tag, sTipo) || tagCol.cumpleCondicion(tag, tags.lastElement()))
					{
						tags.push(tag);							
					}
					else
					{
						throw new ContenidoException("Error: Sintaxis con errores en el texto. \n Con el tag: " + tag + "\n" + "Documento restante: "+documento);
					}
				}
				else 
				{
					boolean esTagApertura= tagCol.esTagApetura(tags.lastElement());
					String pop = tags.lastElement();
					String elementoSinSlash = tag.replace("/", "");
					
					if (tags.empty())
					{
						throw new ContenidoException("Error: Pila Vacia. \n Con el tag: " + tag + "\n" + "Documento restante: "+documento);
					}
					else if (!esTagApertura || !(pop.equals(elementoSinSlash)))
					{
						throw new ContenidoException("Error: Sintaxis con errores en el texto. \n Con el tag: " + tag + "\n" + "Documento restante: "+documento);
					}
					else
					{
						tags.pop();
					}
				}				
			}
			else
			{ //Aca o hay un error de sintaxis o hay espacios despues del ultimo tag.
				throw new ContenidoException("Error: Sintaxis con errores en el texto. \n Con el tag: " + tag + "\n" + "Documento restante: "+documento);
			}
		}	
		return true;
	}
	
}


